#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>


// int main()
// {
//     while(1)
//     {
//         printf("I am a process");
//         sleep(1);
//         _exit(3);
//     }
//     return 0;
// }

// void Print()
// {
//     printf("hello Print\n");
//     exit(5);
// }
// int main()
// {
//     while(1)
//     {
//         printf("I am a process\n");
//         Print();
//         sleep(1);
//         exit(3);
//     }
//     return 0;
// }

// int main()
// {
//     FILE *fp = fopen("./log.txt", "r");
//     printf("%d: %s\n", errno, strerror(errno));
//     return 0;
// }

// enum{
//     success=0,
//     open_err,
//     malloc_err
// };
// const char* errorToDesc(int code)
// {
//     switch (code)
//     {
//     case success:
//         return "success";
//     case open_err:
//         return "file open error";
//     case malloc_err:
//         return "malloc error";
//     default:
//         return "unknown error";
//     }
// }
// int main()
// {
//     int code  = malloc_err;
//     printf("%s\n", errorToDesc(code));
//     return 0;
// }

// int main()
// {
//     // char* str = "hello world";
//     // *str = 'H';
//     //printf("hello world\n");
//     for(int i=0; i<100; i++)
//     {
//         printf("%d: %s\n", i, strerror(i));
//     }
//     return 0;
// }

//验证进程地址空间
// int main()
// {
//     int val = 10;
//     pid_t id = fork();
//     if(id == 0)
//     {
//         int cnt = 0;
//         //子进程
//         while(1)
//         {
//             printf("child pid: %d, ppid: %d, val: %d, &val: %p\n",getpid(),getppid(), val,&val);
//             sleep(1);
//             cnt++;
//             if(cnt == 5)
//             {
//                 val = 20;
//                 printf("val change");
//             }
//         }
//     }
//     else 
//     {
//         //父进程
//         while(1)
//         {
//             printf("father pid: %d, ppid: %d, val: %d, &val: %p\n",getpid(),getppid(), val,&val);
//             sleep(1);
//         }
//     }
//     return 0;
// }

//打印地址
// int val1;//未初始化
// int val2 = 100;//初始化
// int main(int argc, char* argv[], char* env[])
// {
//     printf("code addr: %p\n", main);
//     printf("init data addr: %p\n", &val2);
//     printf("no init data addr: %p\n", &val1);

//     char* heap1 = (char*)malloc(20);
//     char* heap2 = (char*)malloc(20);
//     char* heap3 = (char*)malloc(20);
//     char* heap4 = (char*)malloc(20);
//     printf("heap1 addr: %p\n", heap1);
//     printf("heap2 addr: %p\n", heap2);
//     printf("heap3 addr: %p\n", heap3);
//     printf("heap4 addr: %p\n", heap4);

//     printf("stack1 addr: %p\n", &heap1);
//     printf("stack2 addr: %p\n", &heap2);
//     printf("stack3 addr: %p\n", &heap3);
//     printf("stack4 addr: %p\n", &heap4);

//     // for(int i=0; argv[i]; i++)
//     // {
//     //     printf("&argv[%d]: %p\n", i, argv+i);
//     // }
//     // for(int i=0; env[i]; i++)
//     // {
//     //     printf("&env[%d]: %p\n", i, env+i);
//     // }
//      for(int i=0; argv[i]; i++)
//     {
//         printf("argv[%d]: %p\n", i, argv[i]);
//     }
//     for(int i=0; env[i]; i++)
//     {
//         printf("env[%d]: %p\n", i, env[i]);
//     }

//     return 0;
// }

// 本地变量不能被子进程继承
// int main()
// {
//     const char *myenv = getenv("USER");
//     if(myenv == NULL) printf("getenv get null\n");
//     else printf("myenv=%s\n", myenv);
//     return 0;
// }

// environ
// int main()
// {
//     extern char **environ;
//     for(int i=0;environ[i];i++)
//     {
//         printf("environ[%d]: %s\n", i, environ[i]);
//     }
//     return 0;
// }